package com.w7vm.menuweb.facade;


import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.w7vm.menuweb.dao.BeneficioMsgDAO;
import com.w7vm.menuweb.dao.ContratoCreditoPagamentoDAO;
import com.w7vm.menuweb.dao.ContratoDAO;
import com.w7vm.menuweb.dao.ContratoPagamentoDAO;
import com.w7vm.menuweb.dao.ContratoRestaurantesDAO;
import com.w7vm.menuweb.dao.DescontoPagamentoDAO;
import com.w7vm.menuweb.dao.FormaPagamentoDAO;
import com.w7vm.menuweb.entity.BeneficioMsgSy;
import com.w7vm.menuweb.entity.ContratoCreditoPagamentoWeb;
import com.w7vm.menuweb.entity.ContratoPagamentoWeb;
import com.w7vm.menuweb.entity.ContratoWeb;
import com.w7vm.menuweb.entity.DescontoPagamentoSy;
import com.w7vm.menuweb.entity.FormaPagamentoSy;
import com.w7vm.menuweb.entity.RestauranteSedeWeb;
import com.w7vm.menuweb.utility.ConstantesEJB;
import com.w7vm.menuweb.vo.FormaPagamentoVO;

@Stateless(name="ContratoEJB")
@Remote(ContratoFacade.class)
public class ContratoFacadeImp implements ContratoFacade {
	
    /**
     * Default constructor. 
     */
    public ContratoFacadeImp() {
        // TODO Auto-generated constructor stub
    }
	
	@PersistenceContext
	private EntityManager em;
	

	@EJB
	private ContratoDAO contratoDAO;
	@EJB
	private ContratoRestaurantesDAO contratoRestauranteDAO;
	@EJB
	private ContratoCreditoPagamentoDAO contratoCreditoDAO;
	@EJB
	private ContratoPagamentoDAO contratoPagamentoDAO;
	@EJB
	private BeneficioMsgDAO beneficioMsgDAO;
	@EJB
	private DescontoPagamentoDAO descontoDAO;
	@EJB
	private FormaPagamentoDAO formaPagamentoDAO;
	
	ConstantesEJB constEJB = new ConstantesEJB();

	@Override
	public ContratoWeb alterarDadosContrato(ContratoWeb contratoEntity) {
		return contratoDAO.update(contratoEntity);
	}

	@Override
	public int persisteContratoNovo(ContratoWeb contratoNew, int idContratoOld) {
		int resultContrato = -1;
		ContratoWeb contratoEntity = new ContratoWeb();
		
		contratoEntity = contratoDAO.findContratoByID(idContratoOld);
		contratoEntity = contratoNew;
		contratoEntity.setIdContratoWeb(idContratoOld);
		
		resultContrato = contratoDAO.saveContrato(contratoEntity);
		return resultContrato;
	}
	

	public int alteraRenovacaoContrato(ContratoWeb contratoEntity){
		System.out.println("[METHOD][alteraRenovacaoContrato]");
		
		try{
				Query q1 = em.createQuery("UPDATE ContratoWeb SET planoSy = ?, numeroContrato = ?, dataContratacao = ?," +
						" dataTermino = ?, nomeResponsavel = ?, cpf = ?, cnpj = ?, insEstadual = ?, dataAlt = ? WHERE idContratoWeb = ?");
		
				q1.setParameter(1, contratoEntity.getPlanoSy());
				q1.setParameter(3, contratoEntity.getNumeroContrato());
				q1.setParameter(4, contratoEntity.getDataContratacao());
				q1.setParameter(5, contratoEntity.getDataTermino());
				q1.setParameter(6, contratoEntity.getNomeResponsavel());
				q1.setParameter(7, contratoEntity.getCpf());
				q1.setParameter(8, contratoEntity.getCnpj());
				q1.setParameter(9, contratoEntity.getInsEstadual());
				q1.setParameter(10, contratoEntity.getDataAlt());
				q1.setParameter(11, contratoEntity.getIdContratoWeb());
				
				int updated = q1.executeUpdate();
				return updated;

			}catch (NoResultException e){
				System.err.println(e.getMessage());
				return 0;
		}
	}

	@Override
	public List<ContratoWeb> preparaListaContratoPorNumeroContrato(int numero) {
		return contratoDAO.findContratoByNumero(numero);
	}
	
	@Override
	public List<ContratoWeb> preparaListaContratoPorIDRestaurante(int id){
		return contratoDAO.findContratoByIDRestaurante(id);
	}
	
	
	public List<DescontoPagamentoSy> preparaListaDesconto(String tipoDesconto){
		return descontoDAO.findDescontoPagamentoByTipo(tipoDesconto);
	}
	
	public int defineRegraDesconto(List<DescontoPagamentoSy> descontoL, int qtdeAcessoFilial){
		System.out.println("[METHOD][defineRegraDesconto]");

		for(DescontoPagamentoSy desconto : descontoL){
			if(desconto.getDescontoPara().equals(constEJB.DESCONTO_RENOVACAO)){
				if((qtdeAcessoFilial >= desconto.getRegraQtdeFiliaisMin()) &&
						(qtdeAcessoFilial <= desconto.getRegraQtdeFiliaisMax())){
					return desconto.getValorDesconto();
				}
			}
			else if(desconto.getDescontoPara().equals(constEJB.DESCONTO_NOVOCADASTRO)){
				if((qtdeAcessoFilial >= desconto.getRegraQtdeFiliaisMin()) &&
						(qtdeAcessoFilial <= desconto.getRegraQtdeFiliaisMax())){
					return desconto.getValorDesconto();
				} 				
			}
			else if(desconto.getDescontoPara().equals(constEJB.DESCONTO_MUDAPLANO)){
				if((qtdeAcessoFilial >= desconto.getRegraQtdeFiliaisMin()) &&
						(qtdeAcessoFilial <= desconto.getRegraQtdeFiliaisMax())){
					return desconto.getValorDesconto();
				} 				
			}
		}
		return 0;
	}


	
	public List<BeneficioMsgSy> preparaListaBeneficioMsg(){
		return beneficioMsgDAO.findBeneficiosMsgByAll();
	}

	
	public int calculaQuantidadeDiasContratoVencimento(Date dtTerminoContrato){
		System.out.println("[METHOD - ContratoEJB][calculaQuantidadeDiasContrato]");
		
		int MILLIS_IN_DAY = 86400000;
		
		System.out.println("[METHOD - ContratoEJB][DIAS PARA VENCIMENTO.................................]"+ dtTerminoContrato);

		
		// DataContrato - Termino
		Calendar c1 = Calendar.getInstance();
		c1.setTime(dtTerminoContrato);
		c1.set(Calendar.MILLISECOND, 0);
		c1.set(Calendar.SECOND, 0);
		c1.set(Calendar.MINUTE, 0);
		c1.set(Calendar.HOUR_OF_DAY, 0);
		
		// DataAtual - Dia
		Calendar c2 = Calendar.getInstance();
		Date dateFormat = new Date(); 
		
		c2.setTime(dateFormat);
		c2.set(Calendar.MILLISECOND, 0);
		c2.set(Calendar.SECOND, 0);
		c2.set(Calendar.MINUTE, 0);
		c2.set(Calendar.HOUR_OF_DAY, 0);

		int teste = (int) ((c1.getTimeInMillis() - c2.getTimeInMillis()) / MILLIS_IN_DAY);
		return teste;
	}
	
	
	public String defineRegraRenovacao(int resultCalculo){
		System.out.println("[METHOD - ContratoEJB][defineRegraRenovacao]");
		
		/* DIA > 5     =  NV  -  NAO VENCIDO
		 * DIA 1 >= 5  =  AV  -  A VENCER
		 * DIA 0       =  VH  -  VENCE HOJE
		 * DIA < 0     =  VC  -  VENCIDO
		 */
		
		if(resultCalculo > 5){
			return constEJB.CONTRATO_NAO_VENCIDO;
		}
		else if(resultCalculo >= 1 && resultCalculo <= 5){
			return constEJB.CONTRATO_A_VENCER;
		}
		else if(resultCalculo == 0){
			return constEJB.CONTRATO_VENCE_HOJE;
		}
		else if(resultCalculo < 0){
			return constEJB.CONTRATO_VENCIDO;
		}
		return constEJB.CONTRATO_NAO_VENCIDO;
	}

	@Override
	public void excluiContratoRestauranteFilial(int id) {
		System.out.println("[METHOD][excluiContratoRestauranteFilial]");
		
	}

	@Override
	public List<FormaPagamentoSy> preparaListaFormasPagamento() {
		System.out.println("[METHOD][preparaListaFormasPagamento]");
		return formaPagamentoDAO.findFormaPagamentoByAll();
	}
	
	@Override
	public int ativaDesativaRestauranteContrato(int id, int status, String tipo){
		System.out.println("[METHOD][desativaRestauranteContrato]");
		return contratoDAO.updateStatusRestauranteContrato(id, status, tipo);
	}

//	@Override
//	public int efetuaPagamentoAtraso(int idContratoPagamento, int idFormaPagamento, String codeTransacao,
//			String titularPagamento, Date dataPagamento, int status) {
//		System.out.println("[Method - EJB][efetuaPagamentoAtraso]");
//		//return contratoDAO.updateParcelaPagamento(idContratoPagamento, idFormaPagamento, codeTransacao, titularPagamento, dataPagamento, status);
//		ContratoPagamentoWeb contratoPagamentoEntity = new ContratoPagamentoWeb();
//		contratoPagamentoEntity.setIdContratoPagamentoWeb(idContratoPagamento);
//		contratoPagamentoEntity.	
//		
//		return contratoPagamentoDAO.updateParcelaPagamento(contratoPagamentoEntity);
//	}
	
	
	@Override
	public int efetuaPagamentoAtraso(ContratoPagamentoWeb contratoPagEntity) {
		System.out.println("[Method - EJB][efetuaPagamentoAtraso]");
		return contratoPagamentoDAO.updateParcelaPagamento(contratoPagEntity);
	}

	@Override
	public int excluiPagamentosContrato(List<Integer> pagamentoContratoL) {
		System.out.println("[Method - EJB][excluiPagamentosContrato]");
		int resultDeleteContPagamento = -1;
		
		try{
			resultDeleteContPagamento = contratoPagamentoDAO.deleteContratoPagamento(pagamentoContratoL);
			return resultDeleteContPagamento;
		}
		catch (Exception e) {
			return resultDeleteContPagamento;
		}
	}

	@Override
	public int excluiRestaurantesContrato(List<Integer> restaurantesContratoL) {
		System.out.println("[Method - EJB][excluiRestaurantesContrato]");
		int resultDeleteContRestaurante = -1;

		try{
			resultDeleteContRestaurante = contratoRestauranteDAO.deleteContratoRestaurantes(restaurantesContratoL);
			return resultDeleteContRestaurante;
		}
		catch (Exception e) {
			return resultDeleteContRestaurante;
		}
	}
	
	
	public int alteraPlanoContrato(ContratoWeb contratoEntity){
		System.out.println("[Method - EJB][alteraPlanoContrato]");
		int resultUpdatePlano = -1;

		try{
			resultUpdatePlano = contratoDAO.updatePlanoContrato(contratoEntity);
			return resultUpdatePlano;
		}
		catch (Exception e) {
			e.printStackTrace();
			return resultUpdatePlano;
		}
		
	}


//	@Override
//	public ContratoCreditoPagamentoWeb buscaCreditoPagamentoPorIDContrato(int id) {
//		System.out.println("[Method - EJB][buscaCreditoPagamentoPorIDContrato]");
//		ContratoCreditoPagamentoWeb creditoObj = new ContratoCreditoPagamentoWeb();
//		try{
//			creditoObj = contratoCreditoDAO.findCreditoByContrato(id);
//			return creditoObj;
//		}
//		catch (Exception e) {
//			e.printStackTrace();
//			return creditoObj;
//		}
//	}







}
